package com.kt.bit.bidw.bizmeta.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.kt.bit.bidw.bizmeta.dao.BizMetaInfoDao;
import com.kt.bit.bidw.bizmeta.service.BizMetaInfoService;
import com.kt.bit.bidw.meta.util.PagingInfoUtil;
import com.kt.bit.bidw.meta.util.SearchConditionUtil;

/**
 * 비즈니스메타 정보 관리 service class
 * <br/><b>History</b><br/>
 * <pre>
 * 2012. 5. 4. 최초작성
 * </pre>
 * @author cjsxowls
 * @version 1.0
 */
@Service(value = "bizMetaInfoService")
public class BizMetaInfoServiceImpl implements BizMetaInfoService {
	@Autowired
	private BizMetaInfoDao bizMetaInfoDao;
	
	enum VIEW_OBJ_DATA_FIELD {
		tableNm(0), col(1), colNm(2);
		private final int value;
		VIEW_OBJ_DATA_FIELD(final int value) {
			this.value = value;
		}
		public int getValue() {
			return value;
		}
	};
	
	/**
	 * 비즈니스메타 목록 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 비즈니스메타 목록
	 */
	@Override
	public List<Map<String, Object>> bizObjBasList(final Map data) {
		return bizMetaInfoDao.bizObjBasList(data);
	}
	
	/**
	 * 비즈니스메타 요청 목록 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 비즈니스메타 요청 목록
	 */
	@Override
	public List<Map<String, Object>> bizObjReqList(final Map data) {
		return bizMetaInfoDao.bizObjReqList(data);
	}
	
	/**
	 * BI정보검색 객체유형별 검색Key 목록 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List BI정보검색 검색Key 목록
	 */
	@Override
	public List<Map<String, Object>> atribSearchKeyListByTypeId(final Map<String, Object> data) {
		return bizMetaInfoDao.atribSearchKeyListByTypeId(data);
	}
	
	/**
	 * BI정보검색 목록 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List BI정보검색 목록
	 */
	@Override
	public Map<String, Object> bizPotalSearchList(final Map<String, Object> data) {
		final String strPagePerRowSize = (String)data.get("pagePerRowSize");
		if (strPagePerRowSize == null || strPagePerRowSize.equals("")) {
			data.put("pagePerRowSize", PagingInfoUtil.DEFAULT_PAGE_PER_ROW_SIZE);
		}

		final Integer currentPageNum = Integer.parseInt((String)data.get("currentPageNum"));
		if (currentPageNum == null) {
			data.put("currentPageNum", 1);
		}
		
		String sqlSbst;
		final String searchCondition = SearchConditionUtil.getInstance().getCondition(Integer.parseInt((String)data.get("searchKey")), (String)data.get("searchValue"));
		
		final List<Map<String, Object>> searchColumnList = (List<Map<String, Object>>)data.get("searchColumn");
		for(int i=0; i<searchColumnList.size(); i++) {
			((Map<String, Object>)searchColumnList.get(i)).put("searchCondition", searchCondition);
			sqlSbst = (String)((Map<String, Object>)searchColumnList.get(i)).get("sqlSbst");
			if (!"".equals(sqlSbst)) {
				if (sqlSbst.toUpperCase(Locale.KOREAN).lastIndexOf("ORDER") != -1) {
					sqlSbst = sqlSbst.substring(0, sqlSbst.toUpperCase(Locale.KOREAN).lastIndexOf("ORDER"));
				}
				((Map<String, Object>)searchColumnList.get(i)).put("sqlSbst", sqlSbst);
			}
		}
		
		final PagingInfoUtil pagingInfoUtil = bizMetaInfoDao.bizPotalSearchListPageInfo(data);
		final List<Map<String, Object>> list = bizMetaInfoDao.bizPotalSearchList(data);
		
		final Map<String, Object> map = new HashMap<String, Object>();
		map.put("bizPortalSearchListPageInfo", pagingInfoUtil);
		map.put("bizPortalSearchList", list);
		
		return map;
	}
	
	/**
	 * BI정보검색 목록 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List BI정보검색 목록
	 */
	@Override
	public Map<String, Object> bizPotalSearchDefaultList(final Map<String, Object> data) {
		
		final List<Map<String, Object>> list = bizMetaInfoDao.bizPotalSearchDefaultList(data);
		
		final Map<String, Object> map = new HashMap<String, Object>(); 
		map.put("bizPortalSearchList", list);
		
		return map;
	}
	
	/**
	 * 관점객체 관점멤버 스키마 테이블 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 관점객체 관점멤버 스키마 테이블 조회
	 */
	@Override
	public Map<String, Object> bizViewObjData(final Map<String, Object> data) {
		final List<Map<String, Object>> colInfoList = bizMetaInfoDao.objViewMemberColumnList(data);
		//final List<String> colHeaderList = new ArrayList<String>();
		final List<Map<String, Object>> colHeaderList = new ArrayList<Map<String, Object>>();
		
		if (colInfoList == null) {
			return null;
		} else {
			final StringBuffer sql = new StringBuffer();
			final StringBuffer groupBy = new StringBuffer();
			String orderBy = ""; 
			String tableName = "";
			String top = String.valueOf(data.get("top"));
			if ("".equals(top)) {
				top = "100";
			}
			
			sql.append(" SELECT TOP ").append(top);
			groupBy.append(" GROUP BY ");
			for(final Iterator iterator = colInfoList.iterator(); iterator.hasNext();) {
				final Map<String, Object> map = (Map<String, Object>) iterator.next();
				Map<String, Object> colHeadMap = new HashMap<String, Object>();
				colHeadMap.put("value", String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name())));
				colHeadMap.put("name", String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.colNm.name())));
				
				colHeaderList.add(colHeadMap);
				 
				if (iterator.hasNext()) {
					sql.append(' ').append(String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name())));
					sql.append(" AS ").append(String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name()))).append(',');
					groupBy.append(String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name()))).append(',');
				} else {
					tableName = String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.tableNm.name()));
					sql.append(' ').append(String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name())));
					sql.append(" AS ").append(String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name())));
					groupBy.append(String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name())));
				}
				
				if (String.valueOf(map.get(VIEW_OBJ_DATA_FIELD.col.name())).equals("SORT_SBT_ID")) {
					orderBy = " ORDER BY SORT_SBT_ID";
				} else {
					orderBy = " ORDER BY 1";
				}
				
			}
			
			sql.append(" FROM ").append(tableName);
			data.put("GEN_QUERY", sql.toString() + groupBy.toString() + orderBy);
			
			
			final Map<String, Object> returnMap = new HashMap<String, Object>();
			returnMap.put("COLUMN_HEADER", colHeaderList);
			returnMap.put("ROW_DATA", bizMetaInfoDao.bizViewObjData(data));
			return returnMap;
		}
	}
	
	/**
	 * 관점객체 관점멤버 어트리뷰트 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 관점객체 관점멤버 어트리뷰트 조회
	 */
	@Override
	public List<Map<String, Object>> objViewMemberList(final Map<String, Object> data) {
		return bizMetaInfoDao.objViewMemberList(data);
	}
	
	/**
	 * 관점객체 관점멤버 스키마 테이블 컬럼 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 관점객체 관점멤버 스키마 테이블 컬럼 조회
	 */
	@Override
	public List<Map<String, Object>> objViewMemberColumnList(final Map<String, Object> data) {
		return bizMetaInfoDao.objViewMemberColumnList(data);
	}
	
	/**
	 * 비즈니스메타 조직도 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 비즈니스메타 조직도 조회
	 */
	@Override
	public List<Map<String, Object>> bizOrgList(final Map<String, Object> data) {
		return bizMetaInfoDao.bizOrgList(data);	
	}
	
	/**
	 * 비즈니스메타 요청자 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 비즈니스메타 요청자 조회
	 */
	@Override
	public List<Map<String, Object>> bizRqtUserList(final Map<String, Object> data) {
		return bizMetaInfoDao.bizRqtUserList(data);	
	}
	
	/**
	 * 비즈니스메타 관리자 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 비즈니스메타 관리자 조회
	 */
	@Override
	public List<Map<String, Object>> bizOwnerList(final Map<String, Object> data) {
		return bizMetaInfoDao.bizOwnerList(data);	
	}
	
	/**
	 *정형리포트 실행을 위한 리스트 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List 프로젝트 리스트 조회
	 */
	@Override
	public List<Map<String, Object>> bizPotalProjectRptList(final Map<String, Object> data) {
		return bizMetaInfoDao.bizPotalProjectRptList(data);	
	}
	
	/**
	 * Biz Meta Mstr Mapping 리스트 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List<Map<String, Object>>
	 */
	@Override
	public List<Map<String, Object>> bizMstrMappingList(final Map<String, Object> data) {
		return bizMetaInfoDao.bizMstrMappingList(data);	
	}
	
	/**
	 * BI 정보 맵 조회 DAO 호출<br>
	 * @param param 조회조건 
	 * @return List<Map<String, Object>>
	 */
	@Override
	public List<Map<String, Object>> bizPotalSearchTreeList(final Map<String, Object> data) {
		return bizMetaInfoDao.bizPotalSearchTreeList(data);	
	}
}
